package com.plian.system.service.ms.impl;

import com.plian.Tools.pagedata.PageData;
import com.plian.system.entity.ms.MonthPlan;
import com.plian.system.mapper.ms.MonthPlanMapper;
import com.plian.system.mybatis.base.BaseServiceImpl;
import com.plian.system.service.ms.IMonthPlanService;
import com.plian.system.service.sys.code.IFormCodeService;
import com.plian.system.service.sys.file.FileService;
import com.plian.system.service.sys.orgzation.IOrgService;
import com.plian.system.service.sys.orgzation.OrgzationService;
import com.plian.system.service.sys.user.ISysUserService;
import com.plian.system.service.wf.FormWorkflowService;
import com.plian.system.service.yth.IYthMonthPlanService;
import com.plian.system.wrapper.ms.MonthPlanWrapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 月度计划表 服务实现类
 *
 * @author xiaohu
 */
@Slf4j
@Service
@AllArgsConstructor
public class MonthPlanServiceImpl extends BaseServiceImpl<MonthPlanMapper, MonthPlan> implements IMonthPlanService
		//, BaseFlowService
{

	private FormWorkflowService formWorkflowService;

	private IFormCodeService formCodeService;

	private FileService fileService;

	private MonthPlanMapper monthPlanMapper;

	private OrgzationService orgzationService;

	private MonthPlanWrapper monthPlanWrapper;

	private IYthMonthPlanService ythMonthPlanService;

	private IOrgService orgService;

	private ISysUserService userService;

//	@Override TODO DEL
//	public HashMap<String,Object> commit(String id) {
//		handleStatus(Long.valueOf(id), FormStatusConstant.FLOW);
//		//将需要提交的流程变量返回，用于工作流侧
//		return new HashMap<String,Object>();
//	}
//
//	@Override
//	public Boolean finish(String id) {
//		return handleStatus(Long.valueOf(id), FormStatusConstant.FINISH);
//	}
//
//	@Override
//	public Boolean reject(String id, int formState, String comment) {
//		return handleStatus(Long.valueOf(id), formState);
//	}
//
//	@Override
//	public Boolean checkIsExisted(Long id, String code) {
//		if (Optional.ofNullable(code).isPresent()) {
//			MonthPlan monthPlan = new MonthPlan();
//			monthPlan.setCode(code);
//			if (Optional.ofNullable(getOne(Condition.getQueryWrapper(monthPlan))).isPresent()) {
//				if (id == null || !id.equals(getOne(Condition.getQueryWrapper(monthPlan)).getId())) {
//					return false;
//				}
//			}
//		}
//		return true;
//	}
//
//	@Override
//	@Transactional(rollbackFor=RuntimeException.class)
//	public Boolean submit(MonthPlan monthPlan) {
//		if (!Optional.ofNullable(monthPlan.getStatus()).isPresent()){
//			monthPlan.setStatus(FormStatusConstant.UNREVIEWED);
//		}
//		boolean result = saveOrUpdate(monthPlan);
//		return result;
//	}
//
//	@Override
//	public Boolean checkCancel(Long id) {
//		MonthPlan monthPlan = getById(id);
//		if (!Optional.ofNullable(monthPlan).isPresent()) {
//			return false;
//		}
//		return true;
//	}
//
//	@Override
//	public boolean saveOrUpdate(MonthPlan monthPlan) {
//		if (!Optional.ofNullable(monthPlan.getStatus()).isPresent()) {
//			monthPlan.setStatus(UNREVIEWED);
//		}
//		boolean flag = false;
//		if (!Optional.ofNullable(monthPlan.getId()).isPresent()) {
//			//根据单据类型生成单据编码
//			monthPlan.setCode(formCodeService.getCode(FormTypeConstant.MS_MONTH_PLAN));
//			monthPlan.setFormType(String.valueOf(FormTypeConstant.MS_MONTH_PLAN));
//			flag = true;
//		}
//		boolean result = super.saveOrUpdate(monthPlan);
//		if (flag){
//			fileService.saveAll(String.valueOf(monthPlan.getId()), monthPlan.getDocList());
//		}else {
//			fileService.edit(String.valueOf(monthPlan.getId()), monthPlan.getDocList());
//		}
//		if (flag){
//			fileService.upYthFile(monthPlan.getAttachIds(), monthPlan.getFormType());
//		}
//		return result;
//	}
//
//	@Override
//	public boolean saveTripleSystem(String date) {
//		boolean flag = true;
//		Date start = DateUtil.parse(date, DateUtil.PATTERN_DATE);
//		//获取数据
//		List<MonthPlan> allMonth = ythMonthPlanService.getAllMonth(null, null);
//		remove(Wrappers.<MonthPlan>lambdaQuery().eq(MonthPlan::getDataSource,3));
//
//		Map<String, String> orgSourceIds = orgService.getSourceId();
//		Map<String, String> userSourceIds = userService.getSourceId();
//		if (CollectionUtil.isNotEmpty(allMonth)) {
//			for (MonthPlan monthPlan : allMonth) {
//				String orgId = orgSourceIds.get(monthPlan.getFillCompanyId());
//				if (StringUtils.isNotBlank(orgId)) {
//					monthPlan.setFillCompanyId(orgId);
//					monthPlan.setCreateCompanyId(orgId);
//				}
//				String userId = userSourceIds.get(monthPlan.getCreateUser());
//				if (StringUtils.isNotBlank(userId)) {
//					monthPlan.setCreateUser(userId);
//				}
//				monthPlan.setStatus(FormStatusConstant.FINISH);
//				flag = submit(monthPlan);
//			}
//		}
//		return flag;
//	}
//
//	/**
//	 * 统一处理状态机事件方法
//	 *
//	 * @param id          主键
//	 * @param updateStatus 更新状态
//	 * @return boolean
//	 */
//	private Boolean handleStatus(Long id, int updateStatus) {
//		try {
//			MonthPlan monthPlan = getById(id);
//			/**
//			 * 设置审批人和审批时间
//			 */
//			if (updateStatus == FormStatusConstant.FINISH){
//				monthPlan.setApprovedUser(TokenUtil.getTokenUserId());
//				Date now = DateUtil.now();
//				monthPlan.setApprovedTime(now);
//			}
//			monthPlan.setStatus(updateStatus);
//			updateById(monthPlan);
//			return true;
//		} catch (Exception e) {
//			log.error(ExceptionUtils.getFullStackTrace(e));
//			return false;
//		}
//	}
//
//	@Override
//	@Transactional(rollbackFor=RuntimeException.class)
//	public R initAdd(MonthPlan monthPlan) {
//		MonthPlan old = getOne(new LambdaQueryWrapper<MonthPlan>()
//				.eq(MonthPlan::getFillCompanyId, TokenUtil.getTokenOrgId())
//				.eq(MonthPlan::getFillingMonth, monthPlan.getFillingMonth()));
//		if (Optional.ofNullable(old).isPresent()){
//			return new R(CustomCode.builder().message("新增失败，该年月已填报").code(1999).success(false).build());
//		}
////		monthPlan.setStatus(FormStatusConstant.STASH);
//		boolean result = saveOrUpdate(monthPlan);
//		HashMap<String, Object> processVariable = new HashMap<>();
//		formWorkflowService.startProcessAndSimulate(String.valueOf(monthPlan.getId()),monthPlan.getFormType(),processVariable);
//		return result ? new R(CommonCode.SUCCESS) : new R(CommonCode.FAIL);
//	}
//
//	@Override
//	public List<PageData> findByIds(List<String> formIds) {
//		LambdaQueryWrapper<MonthPlan> queryWrapper = new LambdaQueryWrapper<>();
//		queryWrapper.in(MonthPlan::getId, Func.toLongList(org.apache.commons.lang3.StringUtils.join(formIds, StringPool.COMMA)));
//		List<MonthPlan> monthPlans = list(queryWrapper);
//		List<MonthPlanVO> monthPlanVOS = monthPlanWrapper.entityToVO(monthPlans);
//		List<PageData> pageDataList = new ArrayList<>();
//		try{
//			if (CollectionUtil.isNotEmpty(monthPlanVOS)){
//				for (MonthPlanVO vo : monthPlanVOS){
//					PageData pd = new PageData();
//					pd.put("id", vo.getId());
//					pd.put("UNITNAME", vo.getFillCompanyName());
//					pd.put("APPLICANTNAME", vo.getCreateUserName());
//					pd.put("applicantId", vo.getCreateUser());
//					pd.put("applyOrganizationId", vo.getFillCompanyName());
//					pd.put("formType", FormTypeConstant.MS_MONTH_PLAN);
//					pd.put("orgName", vo.getFillCompanyName());
//					pageDataList.add(pd);
//				}
//			}
//			return pageDataList;
//		} catch (Exception e) {
//			log.error(ExceptionUtils.getFullStackTrace(e));
//		}
//		return pageDataList;
//	}
//
//	@Override
//	public List<Integer> getFormType() {
//		return Arrays.asList(FormTypeConstant.MS_MONTH_PLAN);
//	}
//
//	@Override
//	public void goBackToStash(String formId) {
//		handleStatus(Long.valueOf(formId), UNREVIEWED);
//	}
//
//
//	/**
//	 * 月度计划及总结报表导出
//	 */
//	@Override
//	public void exportExcel(List<PageData> pdlist, HttpServletResponse response, OutputStream os)  {
//		try {
//			String fname = "月度计划总结导出表";
//			os = response.getOutputStream();//取得输出流
//			response.reset();//清空输出流
//			//下面是对中文文件名的处理
//			response.setCharacterEncoding("UTF-8");//设置相应内容的编码格式
//			//读取系统中的模板
//			InputStream inputStream = this.getClass().getResourceAsStream("/exceldemo/月度计划总结模板.xlsx");
//			//InputStream inputStream = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\月度计划总结模板.xlsx"));
//			fname = java.net.URLEncoder.encode(fname, "UTF-8");
//			response.setHeader("Content-Disposition", "attachment;filename=" + new String(fname.getBytes("UTF-8"), "UTF-8") + ".xls");
//			response.setContentType("application/msexcel");//定义输出类型
//
//			//List<PageData> pdlist = (List<PageData>) pd.get("list");
//			//多少行
//			int row = pdlist.size();
//			//克隆模板得到一个新的excel模板
//			DynamicOperateExcelUtils dynamicOperateExcelUtils = new DynamicOperateExcelUtils(inputStream);
//			//获取工作簿
//			Workbook workbook = dynamicOperateExcelUtils.getWorkbook();
//			//获取表格
//			Sheet sheet = dynamicOperateExcelUtils.getSheet(0);
//			CellStyle cellStyle = workbook.createCellStyle();
//
//			cellStyle = MonthPlanServiceImpl.setCellStyle(cellStyle);
//			for (int a = 0; a < row; a++) {
//				PageData welfareExpendVO = pdlist.get(a);
//				Row row1 = sheet.createRow(a+2);
//				//非增行的替换模板单元格的数据
//				for (int b = 0; b < 3; b++) {
//					Cell cell = row1.createCell(b);
//					switch (b){
//						case 0: dynamicOperateExcelUtils.replaceCellValue(a + 2, b, welfareExpendVO.getString("orgName"));break;
//						case 1: dynamicOperateExcelUtils.replaceCellValue(a + 2, b, welfareExpendVO.getString("monthPlan"));break;
//						case 2: dynamicOperateExcelUtils.replaceCellValue(a + 2, b, welfareExpendVO.getString("monthSummary"));break;
//						default:break;
//					}
//					cell.setCellStyle(cellStyle);
//				}
//			}
//			//dynamicOperateExcelUtils.exportExcel("D:\\excel2.xlsx");
//			workbook.write(os);
//			os.flush();
//			os.close();
//			workbook.close();
//		} catch (IOException e) {
//			log.error(ExceptionUtils.getFullStackTrace(e));
//		}
//	}
//
//
//	/**
//	 * 年度计划及总结报表导出
//	 */
//	@Override
//	public void exportExcelByyear(List<PageData> pdlist, HttpServletResponse response, OutputStream os)  {
//		try {
//			String fname = "年度计划总结导出表";
//			os = response.getOutputStream();//取得输出流
//			response.reset();//清空输出流
//			//下面是对中文文件名的处理
//			response.setCharacterEncoding("UTF-8");//设置相应内容的编码格式
//			//读取系统中的模板
//			InputStream inputStream = this.getClass().getResourceAsStream("/exceldemo/年度计划总结模板.xlsx");
//			//InputStream inputStream = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\年度计划总结模板.xlsx"));
//			fname = java.net.URLEncoder.encode(fname, "UTF-8");
//			response.setHeader("Content-Disposition", "attachment;filename=" + new String(fname.getBytes("UTF-8"), "UTF-8") + ".xls");
//			response.setContentType("application/msexcel");//定义输出类型
//
//			//List<PageData> pdlist = (List<PageData>) pd.get("list");
//			//多少行
//			int row = pdlist.size();
//			//克隆模板得到一个新的excel模板
//			DynamicOperateExcelUtils dynamicOperateExcelUtils = new DynamicOperateExcelUtils(inputStream);
//			//获取工作簿
//			Workbook workbook = dynamicOperateExcelUtils.getWorkbook();
//			//获取表格
//			Sheet sheet = dynamicOperateExcelUtils.getSheet(0);
//			CellStyle cellStyle = workbook.createCellStyle();
//
//			cellStyle = MonthPlanServiceImpl.setCellStyle(cellStyle);
//			for (int a = 0; a < row; a++) {
//				PageData welfareExpendVO = pdlist.get(a);
//				Row row1 = sheet.createRow(a+2);
//				//非增行的替换模板单元格的数据
//				for (int b = 0; b < 4; b++) {
//					Cell cell = row1.createCell(b);
//					switch (b){
//						case 0: dynamicOperateExcelUtils.replaceCellValue(a + 2, b, welfareExpendVO.getString("orgName"));break;
//						case 1: dynamicOperateExcelUtils.replaceCellValue(a + 2, b, welfareExpendVO.getString("fillingMonth"));break;
//						case 2: dynamicOperateExcelUtils.replaceCellValue(a + 2, b, welfareExpendVO.getString("monthPlan"));break;
//						case 3: dynamicOperateExcelUtils.replaceCellValue(a + 2, b, welfareExpendVO.getString("monthSummary"));break;
//						default:break;
//					}
//					cell.setCellStyle(cellStyle);
//				}
//			}
//			//dynamicOperateExcelUtils.exportExcel("D:\\excel2.xlsx");
//			workbook.write(os);
//			os.flush();
//			os.close();
//			workbook.close();
//		} catch (IOException e) {
//			log.error(ExceptionUtils.getFullStackTrace(e));
//		}
//	}
//
//	public static CellStyle setCellStyle(CellStyle cellStyle){
//		//设置样式对象，这里仅设置了边框属性
//		cellStyle.setBorderBottom(BorderStyle.THIN);
//		cellStyle.setBorderLeft(BorderStyle.THIN);
//		cellStyle.setBorderRight(BorderStyle.THIN);
//		cellStyle.setBorderTop(BorderStyle.THIN);
//
//		//设置自动换行
//		cellStyle.setWrapText(true);
//
//		cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //下边框
//		cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());//左边框
//		cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());//右边框
//		cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());//上边框
//
//		//垂直居中
//		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//		//水平居中
//		cellStyle.setAlignment(HorizontalAlignment.CENTER);
//
//		return cellStyle;
//	}

	@Override
	public List<PageData> orgidsBymonth(PageData pageData){
		ArrayList<String> orgIds = (ArrayList<String>) pageData.get("orgIds");
		String fillingMonth = pageData.getString("fillingMonth");
		ArrayList<PageData> pdlist = new ArrayList<>();
		for (String orgid:orgIds){
			PageData pd1 = new PageData();
			pd1.put("orgId",orgid);
			pd1.put("fillingMonth",fillingMonth);
			PageData pageData1 = monthPlanMapper.orgidsBymonth(pd1);
			if (pageData1 != null){
				PageData org = orgzationService.getCompanyNameById(pageData1.getString("fillCompanyId"));
				if (org != null) {
					pageData1.put("orgName",org.getString("name"));
				}
				pdlist.add(pageData1);
			}
		}
		return pdlist;
	}

	@Override
	public List<PageData> orgidsByyear(PageData pageData){
		ArrayList<String> orgIds = (ArrayList<String>) pageData.get("orgIds");
		String fillingMonth = pageData.getString("fillingYear");
		ArrayList<PageData> pdlist = new ArrayList<>();
		for (String orgid:orgIds){
			PageData pd2 = new PageData();
			PageData pd1 = new PageData();
			pd1.put("orgId",orgid);
			pd1.put("fillingMonth",fillingMonth+"%");
			ArrayList<PageData> pdlist2 = new ArrayList<>();
			List<PageData> list = monthPlanMapper.orgidsByyear(pd1);
			for (PageData pageData1:list){
				if (pageData1.getString("fillCompanyId") != null){
					PageData org = orgzationService.getCompanyNameById(pageData1.getString("fillCompanyId"));
					if (org != null) {
						pageData1.put("orgName",org.getString("name"));
						pd2.put("orgName",org.getString("name"));
					}
					if (pageData1!=null){
						pdlist2.add(pageData1);
					}
				}
				pd2.put("list",pdlist2);
			}
			if (pd2.size() != 0){
				pdlist.add(pd2);
			}
		}
		return pdlist;
	}
}
